package com.puzzle;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Point;
import android.graphics.Rect;
import android.os.Handler;
import android.os.Handler.Callback;
import android.os.Message;
import android.util.AttributeSet;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AbsoluteLayout;

// 图片控件
class PictureCtrl extends View implements OnClickListener {
    private Handler mCallback;          // 回调
    private boolean mHasBorder;         // 有边框则为 true，否则为 false
    private Bitmap mImage;              // 图片
    private Point mOriginalPosition;    // 原位置，即刚被创建时的初始位置
    private final Paint mPaint;         // 绘图相关信息
    private Point mPosition;            // 当前位置

    /**
     * 构造方法。
     * @param context   设备环境
     */
    public PictureCtrl(Context context) {
        super(context);
        mPaint = new Paint();
    }

    /**
     * 构造方法。
     * @param context   设备环境
     * @param attrs     属性集合
     */
    public PictureCtrl(Context context, AttributeSet attrs) {
        super(context, attrs);
        mPaint = new Paint();
    }

    /**
     * 构造方法。
     * @param context   设备环境
     * @param attrs     属性集合
     * @param defStyle  默认属性
     */
    public PictureCtrl(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        mPaint = new Paint();
    }

    /**
     * 构造方法。
     * @param callback  回调
     * @param context   设备环境
     * @param hasBorder 有边框则为 true，否则为 false
     * @param image     图片
     * @param size      尺寸
     * @param x, y      左上角坐标
     */
    public PictureCtrl(Callback callback, Context context, boolean hasBorder, Bitmap image, int size, int x, int y) {
        super(context);

        // 初始化成员
        mCallback = new Handler(callback);
        mHasBorder = hasBorder;
        mImage = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);
        mOriginalPosition = new Point(x, y);
        mPaint = new Paint();
        mPosition = new Point(x, y);
        final Canvas drawer = new Canvas(mImage);
        drawer.drawBitmap(image, new Rect(x, y, x + size, y + size), new Rect(0, 0, size, size), mPaint);

        // 添加单击事件监听者
        super.setOnClickListener(this);
    }

    /**
     * 画边框。
     * @param drawer    绘图者
     */
    private void drawEdge(Canvas drawer) {
        final int size = super.getWidth();

        mPaint.setColor(Const.COLOR_LEFT_TOP_1);
        drawer.drawLine(0, 0, size - 1, 0, mPaint);
        drawer.drawLine(0, 0, 0, size - 1, mPaint);

        mPaint.setColor(Const.COLOR_LEFT_TOP_2);
        drawer.drawLine(1, 1, size - 2, 1, mPaint);
        drawer.drawLine(1, 1, 1, size - 2, mPaint);

        mPaint.setColor(Const.COLOR_RIGHT_BOTTOM_1);
        drawer.drawLine(size - 1, 0, size - 1, size - 1, mPaint);
        drawer.drawLine(0, size - 1, size - 1, size - 1, mPaint);

        mPaint.setColor(Const.COLOR_RIGHT_BOTTOM_2);
        drawer.drawLine(size - 2, 1, size - 2, size - 2, mPaint);
        drawer.drawLine(1, size - 2, size - 2, size - 2, mPaint);
    }

    /**
     * 获取当前位置。
     * @return 当前位置
     */    
    public final Point getPosition() {
        return mPosition;
    }

    /**
     * 判断自身是否在初始位置。
     * @return 在初始位置则返回 true，否则返回 false
     */
    public boolean isOnOriginalPosition() {
        return mOriginalPosition.equals(mPosition);
    }

    /**
     * 单击事件的响应方法。
     * @param view  被单击的控件
     */
    @Override
    public void onClick(View view) {
        final Message message = Message.obtain();
        message.what = Const.UM_PICTURE_CTRL_CLICKED;
        message.obj = view;
        mCallback.sendMessage(message);
    }

    /**
     * 重绘事件的响应方法。
     * @param drawer    绘图者
     */
    @Override
    protected void onDraw(Canvas drawer) {
        drawer.drawBitmap(mImage, 0, 0, mPaint);
        if (mHasBorder) {
            this.drawEdge(drawer);
        }
    }

    /**
     * 设置边框。
     * @param hasBorder 有边框则为 true，否则为 false
     */
    public void setBorder(boolean hasBorder) {
        if (mHasBorder == hasBorder) {
            return;
        }
        mHasBorder = hasBorder;
        super.invalidate();
    }

    /**
     * 设置当前位置。
     * @param position 当前位置
     */        
    public void setPosition(Point position) {
        mPosition = position;
        final AbsoluteLayout.LayoutParams params = (AbsoluteLayout.LayoutParams)super.getLayoutParams();
        params.x = position.x;
        params.y = position.y;
        super.setLayoutParams(params);
    }
}
